﻿#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
////typedef int* pint;
////typedef int(*parr_t)[10];//数组指针类型的重命名
////typedef int(*pf_t)(int ,int);//函数指针类型的重命名
//
//
//int main()
//{
//
////	//字符指针
////	char ch = 'w';
////	char* pc = &ch;
//////同样，对于一个字符串，也可以用字符指针
////	char arr[] = "abcd";
////	//此时存的是首元素地址
////	char* pch1 = arr;
////	//此时存的是常量字符串，不能被修改,但依旧是首元素地址
//	char* pch2 = "abcd";//一般在前面加上const防止修改报错
//	//*pch2 = "baa";
//	printf("%c\n", *pch2);
//	printf("%s", pch2);//%s需要首元素地址，而不是首元素
//
//	//int arr[10] = { 0 };
//	//int* p[10] = arr;//指针数组，类型int*
//	//int(*p)[10] = &arr;//数组指针，指向数组的地址，类型int(*)[10],10是指向的数组中的元素个数
//	//int* a, b;//a是int*，b是int
//	//pint c, d;//cd都是int*
//	//parr_t a1, a2;
//	return 0;
//}
//#include <stdio.h>
//void test(int(*p)[5], int r, int c)
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < r; i++)
//	{
//		for (j = 0; j < c; j++)
//		{
//			printf("%d ", *(*(p + i) + j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };
//	test(arr, 3, 5);
//	return 0;
//}
//#include <stdio.h>
//int Add(int x, int y)
//{
//	return x + y;
//}
//int Sub(int x, int y)
//{
//	return x - y;
//}
//int main()
//{
//	int (*p[2])(int, int) = { Add,Sub };
//	return 0;
//}
#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择：");
		scanf("%d", &input);
		if ((input <= 4 && input >= 1))
		{
			printf("输入操作数：");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输⼊有误\n");
		}
	} while (input);
	return 0;
}